package org.example.bridge;

//桥接模式（Bridge Pattern）是一种结构型设计模式，它将抽象部分与实现部分分离，使它们可以独立变化。
// 桥接模式是处理多维变化的强大工具，特别适用于：
//需要支持多平台的软件系统
//需要提供多种实现方式的框架
//存在多个独立变化维度的复杂系统
//希望避免类层次结构过于复杂的情况


// 2. 具体实现 - Windows渲染引擎
class WindowsRenderer implements RenderEngine {
    @Override
    public void renderButton(String text) {
        System.out.println("[Windows] 渲染按钮: " + text + " (带有Aero效果)");
    }

    @Override
    public void renderCheckbox(boolean isChecked) {
        String status = isChecked ? "✓" : "☐";
        System.out.println("[Windows] 渲染复选框: " + status + " (使用Segoe UI字体)");
    }
}

// 3. 具体实现 - Linux渲染引擎
class LinuxRenderer implements RenderEngine {
    @Override
    public void renderButton(String text) {
        System.out.println("[Linux] 渲染按钮: " + text + " (GTK+风格)");
    }

    @Override
    public void renderCheckbox(boolean isChecked) {
        String status = isChecked ? "[X]" : "[ ]";
        System.out.println("[Linux] 渲染复选框: " + status + " (使用GNOME主题)");
    }
}

// 4. 具体实现 - Mac渲染引擎
class MacRenderer implements RenderEngine {
    @Override
    public void renderButton(String text) {
        System.out.println("[macOS] 渲染按钮: " + text + " (Aqua风格)");
    }

    @Override
    public void renderCheckbox(boolean isChecked) {
        String status = isChecked ? "☑" : "☐";
        System.out.println("[macOS] 渲染复选框: " + status + " (使用San Francisco字体)");
    }
}

// 5. 抽象部分 - UI控件
abstract class UIControl {
    protected RenderEngine renderer; // 桥接关键点

    protected UIControl(RenderEngine renderer) {
        this.renderer = renderer;
    }

    public abstract void render();
}

// 6. 扩展抽象 - 按钮控件
class Button extends UIControl {
    private String text;

    public Button(String text, RenderEngine renderer) {
        super(renderer);
        this.text = text;
    }

    @Override
    public void render() {
        renderer.renderButton(text);
    }
}

// 7. 扩展抽象 - 复选框控件
class Checkbox extends UIControl {
    private boolean isChecked;

    public Checkbox(boolean isChecked, RenderEngine renderer) {
        super(renderer);
        this.isChecked = isChecked;
    }

    @Override
    public void render() {
        renderer.renderCheckbox(isChecked);
    }

    public void toggle() {
        isChecked = !isChecked;
        System.out.println("复选框状态切换为: " + isChecked);
    }
}

// 8. 客户端代码
public class BridgeDemo {
    public static void main(String[] args) {
        // 创建不同平台的渲染引擎
        RenderEngine windows = new WindowsRenderer();
        RenderEngine linux = new LinuxRenderer();
        RenderEngine mac = new MacRenderer();

        // 创建Windows平台的按钮
        Button winButton = new Button("确定", windows);
        winButton.render();

        // 创建Linux平台的复选框
        Checkbox linuxCheckbox = new Checkbox(true, linux);
        linuxCheckbox.render();

        // 创建Mac平台的按钮和复选框
        Button macButton = new Button("取消", mac);
        Checkbox macCheckbox = new Checkbox(false, mac);

        macButton.render();
        macCheckbox.render();

        // 切换复选框状态并重新渲染
        System.out.println("\n切换复选框状态:");
        macCheckbox.toggle();
        macCheckbox.render();

        // 动态切换渲染引擎
        System.out.println("\n动态切换渲染引擎:");
        Button dynamicButton = new Button("动态按钮", windows);
        dynamicButton.render();

        // 切换到Linux渲染
        dynamicButton = new Button("动态按钮", linux);
        dynamicButton.render();
    }
}